#!/usr/bin/env python3

import os
import time

# 检查是否是 root 用户
if os.geteuid() != 0:
    print("Please run as root")
    exit(1)

# 完整的字符到扫描码的映射
key_map = {
    'a': b'\x04', 'b': b'\x05', 'c': b'\x06', 'd': b'\x07', 'e': b'\x08',
    'f': b'\x09', 'g': b'\x0a', 'h': b'\x0b', 'i': b'\x0c', 'j': b'\x0d',
    'k': b'\x0e', 'l': b'\x0f', 'm': b'\x10', 'n': b'\x11', 'o': b'\x12',
    'p': b'\x13', 'q': b'\x14', 'r': b'\x15', 's': b'\x16', 't': b'\x17',
    'u': b'\x18', 'v': b'\x19', 'w': b'\x1a', 'x': b'\x1b', 'y': b'\x1c',
    'z': b'\x1d', 
    
    '1': b'\x1e', '2': b'\x1f', '3': b'\x20', '4': b'\x21',
    '5': b'\x22', '6': b'\x23', '7': b'\x24', '8': b'\x25', '9': b'\x26',
    '0': b'\x27', 
    
    'return': b'\x28', 'enter': b'\x28', 'esc': b'\x29', 'escape': b'\x29',
    'bckspc': b'\x2a', 'backspace': b'\x2a', 'tab': b'\x2b', 'space': b'\x2c', 
    'minus': b'\x2d', 'equal': b'\x2e', 'grave': b'\x35',  # 减号、等号、反引号的映射
    'dash': b'\x2d', 'equals': b'\x2e', 'lbracket': b'\x2f', 'rbracket': b'\x30',
    'backslash': b'\x31', 'hash': b'\x32', 'number': b'\x32', 'semicolon': b'\x33', 'quote': b'\x34',
    'backquote': b'\x35', 'tilde': b'\x35', 'comma': b'\x36', 'period': b'\x37', 'stop': b'\x37',
    'slash': b'\x38', 'caps-lock': b'\x39', 'capslock': b'\x39', 

    'f1': b'\x3a', 'f2': b'\x3b', 'f3': b'\x3c', 'f4': b'\x3d', 'f5': b'\x3e', 
    'f6': b'\x3f', 'f7': b'\x40', 'f8': b'\x41', 'f9': b'\x42', 'f10': b'\x43', 
    'f11': b'\x44', 'f12': b'\x45',

    'print': b'\x46', 'scroll-lock': b'\x47', 'scrolllock': b'\x47', 'pause': b'\x48', 'insert': b'\x49',
    'home': b'\x4a', 'pageup': b'\x4b', 'pgup': b'\x4b', 'del': b'\x4c', 'delete': b'\x4c',
    'end': b'\x4d', 'pagedown': b'\x4e', 'pgdown': b'\x4e', 'right': b'\x4f', 'left': b'\x50',
    'down': b'\x51', 'up': b'\x52', 'num-lock': b'\x53', 'numlock': b'\x53', 'kp-divide': b'\x54',
    'kp-multiply': b'\x55', 'kp-minus': b'\x56', 'kp-plus': b'\x57', 'kp-enter': b'\x58', 'kp-return': b'\x58',
    'kp-1': b'\x59', 'kp-2': b'\x5a', 'kp-3': b'\x5b', 'kp-4': b'\x5c', 'kp-5': b'\x5d',
    'kp-6': b'\x5e', 'kp-7': b'\x5f', 'kp-8': b'\x60', 'kp-9': b'\x61', 'kp-0': b'\x62',
    'kp-period': b'\x63', 'kp-stop': b'\x63', 'application': b'\x65', 'power': b'\x66', 'kp-equals': b'\x67',
    'kp-equal': b'\x67', 'f13': b'\x68', 'f14': b'\x69', 'f15': b'\x6a', 'f16': b'\x6b',
    'f17': b'\x6c', 'f18': b'\x6d', 'f19': b'\x6e', 'f20': b'\x6f', 'f21': b'\x70',
    'f22': b'\x71', 'f23': b'\x72', 'f24': b'\x73', 'execute': b'\x74', 'help': b'\x75',
    'menu': b'\x76', 'select': b'\x77', 'cancel': b'\x78', 'redo': b'\x79', 'undo': b'\x7a',
    'cut': b'\x7b', 'copy': b'\x7c', 'paste': b'\x7d', 'find': b'\x7e', 'mute': b'\x7f',
    'volume-up': b'\x80', 'volume-down': b'\x81',

    'left-ctrl': b'\x01', 'right-ctrl': b'\x10', 'left-shift': b'\x02', 'right-shift': b'\x20', 'left-alt': b'\x04',
    'right-alt': b'\x40', 'left-meta': b'\x08', 'right-meta': b'\x80',
}

# 特殊符号的映射逻辑
special_char_map = {
    '!': '1', '@': '2', '#': '3', '$': '4', '%': '5',
    '^': '6', '&': '7', '*': '8', '(': '9', ')': '0',
    '~': 'grave', '_': 'minus', '+': 'equal',  # 需要Shift键的符号
    '-': 'minus', '=': 'equal', '`': 'grave',  # 不需要Shift键的符号
    '|': 'backslash', ':': 'semicolon', '"': 'quote',
    '<': 'comma', '>': 'period', '?': 'slash',  # 需要Shift键的符号
    '\\': 'backslash', ';': 'semicolon', '\'': 'quote',
    ',': 'comma', '.': 'period', '/': 'slash',  # 不需要Shift键的符号
    '[': 'lbracket', ']': 'rbracket',  # 不需要Shift键的符号
    '{': 'lbracket', '}': 'rbracket',  # 需要Shift键的符号
}


def send_special_char(char, f):
    if char in special_char_map:
        key = special_char_map[char]
        shift_pressed = char in ['!', '@', '#', '$', '%', '^', '&', '*', '(', ')',
                                 '~', '_', '+', '|', ':', '"', '<', '>', '?',
                                 '{', '}']  
        if shift_pressed:
            f.write(key_map['left-shift'] + b'\x00' + key_map[key] + b'\x00\x00\x00\x00\x00')
            # 释放key键
            f.write(key_map['left-shift'] + b'\x00\x00\x00\x00\x00\x00\x00')
        else:
            f.write(b'\x00\x00' + key_map[key] + b'\x00\x00\x00\x00\x00')
            f.write(b'\x00\x00\x00\x00\x00\x00\x00\x00')

        f.write(b'\x00\x00\x00\x00\x00\x00\x00\x00')


def is_chinese(char):
    """检查字符是否是汉字"""
    return '\u4e00' <= char <= '\u9fff'

# 从文件读取文本
with open('your_text_file.txt', 'r') as file:
    text = file.read()

# 打开设备文件
print('开始发送文本...')
for char in text:
    with open('/dev/hidg0', 'wb') as f:
        print(char, end='', flush=True)
        if char in special_char_map:
            send_special_char(char, f)

        elif char in [' ', '\t', '\n']:  # 检查空格、Tab和换行符
            key = 'space' if char == ' ' else 'tab' if char == '\t' else 'enter'
            scan_code = key_map[key]
            f.write(b'\x00\x00' + scan_code + b'\x00\x00\x00\x00\x00')
            f.write(b'\x00\x00\x00\x00\x00\x00\x00\x00')  # 释放按键
            
        elif is_chinese(char):
            # 处理汉字输入
            unicode_val = ord(char)
            hex_str = f"{unicode_val:X}".lower()  # 将Unicode值转换为十六进制字符串，并转换为小写

                # 按下Alt键
            f.write(key_map['left-alt'] + b'\x00\x00\x00\x00\x00\x00\x00')
            # 输入加号(+)
            f.write(key_map['left-alt'] + b'\x00' + key_map['kp-plus'] + b'\x00\x00\x00\x00\x00')
            f.write(key_map['left-alt'] + b'\x00\x00\x00\x00\x00\x00\x00')  # 释放加号键
            # 发送每个十六进制数字的扫描码
            for digit in hex_str:
                # 按下数字键
                f.write(key_map['left-alt'] + b'\x00' + key_map.get(digit, b'\x00') + b'\x00\x00\x00\x00\x00')
                # 释放数字键
                f.write(key_map['left-alt'] + b'\x00\x00\x00\x00\x00\x00\x00')

            f.write(b'\x00\x00\x00\x00\x00\x00\x00\x00')  # 释放按键
            
        else:
            shift_pressed = char.isupper()  # 检查是否是大写字母

            if shift_pressed:
                char = char.lower()  # 将字符转换为小写来获取扫描码

            # 获取每个字符的扫描码
            scan_code = key_map.get(char, b'\x00')  # 如果找不到映射，则为 '\x00'

            # 如果是大写字母，先发送Shift键的扫描码
            if shift_pressed:
                f.write(key_map['left-shift'] + b'\x00' + scan_code + b'\x00\x00\x00\x00\x00')
                f.write(b'\x00\x00\x00\x00\x00\x00\x00\x00')  # 释放按键
            else:
                f.write(b'\x00\x00' + scan_code + b'\x00\x00\x00\x00\x00')
                f.write(b'\x00\x00\x00\x00\x00\x00\x00\x00')  # 释放按键

        # 释放所有按键
        f.write(b'\x00\x00\x00\x00\x00\x00\x00\x00')
        time.sleep(0.1)  # 适当的延迟
